#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <fstream>
#include <fcntl.h>

const char *root = "/";
const char *dev_null = "/dev/null";

// 守护进程化
void Daemonize(bool ischdir, bool isclose) {
    // 1. 忽略部分终端信号
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);

    if(fork() > 0) {
        std::cout << "父进程退出......" << std::endl;
        exit(0);
    }

    // 子进程
    setsid(); // 创建新会话; 子进程成为新的会话组长
 
    if(ischdir) {
        chdir(root); // 改变工作目录为根目录
    }

    // 关闭标准输入、输出、错误
    if(isclose) {
        close(0);
        close(1);
        close(2);
    } else {
        // 一般进行重定向即可
        int fd = open(dev_null, O_RDWR);
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
    }
}